package inits

import (
	"fmt"
	"github.com/fsnotify/fsnotify"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jinzhu/gorm"
	"github.com/spf13/viper"
	"log"
	"time"
	// "gorm.io/driver/mysql"
	// "gorm.io/gorm"
)

// const PAGE_SIZE int = 10

type Config struct {
	Name string
}

func Init(name string) error {
	c := Config{
		Name: name,
	}

	// 初始化配置文件
	if err := c.initConfig(); err != nil {
		return err
	}

	// 监控配置文件变化并热加载程序
	c.watchConfig()

	return nil
}

func (c *Config) initConfig() error {
	if c.Name != "" {
		viper.SetConfigFile(c.Name) // 如果指定了配置文件，则解析指定的配置文件
	} else {
		viper.AddConfigPath("conf") // 如果没有指定配置文件，则解析默认的配置文件
		viper.SetConfigName("conf")
	}
	viper.SetConfigType("yaml")                  // 设置配置文件格式为YAML
	if err := viper.ReadInConfig(); err != nil { // viper解析配置文件
		return err
	}

	return nil
}

// 监控配置文件变化并热加载程序
func (c *Config) watchConfig() {
	viper.WatchConfig()
	viper.OnConfigChange(func(e fsnotify.Event) {
		log.Printf("Config file changed: %s", e.Name)
	})
}

//
// //Database struct
// var DB         *gorm.DB

// Database struct
type Database struct {
	DB *gorm.DB
	TX *gorm.DB
}
type DBHandler interface {
	NewDatabase() Database
}

type DBConf struct {
	Driver string
	// Host 主机地址
	Host string
	// Port 主机端口
	Port string
	// User 用户名
	User string
	// Password 密码
	Password string
	// DbName 数据库名称
	DbName string
	// Charset 数据库编码
	Charset string
}

// NewDatabase : intializes and returns mysql db
func NewDatabase() Database {
	conf := &DBConf{
		Host:     viper.GetString("database.host"),
		User:     viper.GetString("database.username"),
		Password: viper.GetString("database.password"),
		DbName:   viper.GetString("database.name"),
	}
	config := fmt.Sprintf("%s:%s@tcp(%s)/%s?parseTime=true&charset=utf8&parseTime=%t&loc=%s",
		conf.User,
		conf.Password,
		conf.Host,
		conf.DbName,
		true,
		"Local")

	db, err := gorm.Open("mysql", config)

	if err != nil {
		panic("Failed to connect to database!")

	}
	db.SingularTable(true)
	mysqlDb := db.DB()
	mysqlDb.SetMaxIdleConns(10)
	mysqlDb.SetMaxOpenConns(5)
	mysqlDb.SetConnMaxLifetime(time.Second * 30)

	fmt.Println("Database connection established")
	return Database{
		DB: db,
		TX: db.Begin(),
	}

}
